package com.smartandroid.sa.sherlock.app;

import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v4.app.Watson;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.view.Window;

import com.smartandroid.sa.sherlock.ActionBarSherlock;
import com.smartandroid.sa.sherlock.ActionBarSherlock.OnActionModeFinishedListener;
import com.smartandroid.sa.sherlock.ActionBarSherlock.OnActionModeStartedListener;
import com.smartandroid.sa.sherlock.view.ActionMode;
import com.smartandroid.sa.sherlock.view.Menu;
import com.smartandroid.sa.sherlock.view.MenuInflater;
import com.smartandroid.sa.sherlock.view.MenuItem;

/** @see {@link android.support.v4.app.Watson} */
public class SherlockFragmentActivity extends Watson implements
		OnActionModeStartedListener, OnActionModeFinishedListener {
	private static final String TAG = "SherlockFragmentActivity";

	private ActionBarSherlock mSherlock;
	private boolean mIgnoreNativeCreate = false;
	private boolean mIgnoreNativePrepare = false;
	private boolean mIgnoreNativeSelected = false;

	protected final ActionBarSherlock getSherlock() {
		if (mSherlock == null) {
			mSherlock = ActionBarSherlock.wrap(this,
					ActionBarSherlock.FLAG_DELEGATE);
		}
		return mSherlock;
	}

	// /////////////////////////////////////////////////////////////////////////
	// Action bar and mode
	// /////////////////////////////////////////////////////////////////////////

	public ActionBar getSupportActionBar() {
		return getSherlock().getActionBar();
	}

	public ActionMode startActionMode(ActionMode.Callback callback) {
		return getSherlock().startActionMode(callback);
	}

	@Override
	public void onActionModeStarted(ActionMode mode) {
	}

	@Override
	public void onActionModeFinished(ActionMode mode) {
	}

	// /////////////////////////////////////////////////////////////////////////
	// General lifecycle/callback dispatching
	// /////////////////////////////////////////////////////////////////////////

	@Override
	public void onConfigurationChanged(Configuration newConfig) {
		super.onConfigurationChanged(newConfig);
		getSherlock().dispatchConfigurationChanged(newConfig);
	}

	@Override
	protected void onPostResume() {
		super.onPostResume();
		getSherlock().dispatchPostResume();
	}

	@Override
	protected void onPause() {
		getSherlock().dispatchPause();
		super.onPause();
	}

	@Override
	protected void onStop() {
		getSherlock().dispatchStop();
		super.onStop();
	}

	@Override
	protected void onDestroy() {
		getSherlock().dispatchDestroy();
		super.onDestroy();
	}

	@Override
	protected void onPostCreate(Bundle savedInstanceState) {
		getSherlock().dispatchPostCreate(savedInstanceState);
		super.onPostCreate(savedInstanceState);
	}

	@Override
	protected void onTitleChanged(CharSequence title, int color) {
		getSherlock().dispatchTitleChanged(title, color);
		super.onTitleChanged(title, color);
	}

	@Override
	public final boolean onMenuOpened(int featureId, android.view.Menu menu) {
		if (getSherlock().dispatchMenuOpened(featureId, menu)) {
			return true;
		}
		return super.onMenuOpened(featureId, menu);
	}

	@Override
	public void onPanelClosed(int featureId, android.view.Menu menu) {
		getSherlock().dispatchPanelClosed(featureId, menu);
		super.onPanelClosed(featureId, menu);
	}

	@Override
	public boolean dispatchKeyEvent(KeyEvent event) {
		if (getSherlock().dispatchKeyEvent(event)) {
			return true;
		}
		return super.dispatchKeyEvent(event);
	}

	@Override
	protected void onSaveInstanceState(Bundle outState) {
		super.onSaveInstanceState(outState);
		getSherlock().dispatchSaveInstanceState(outState);
	}

	@Override
	protected void onRestoreInstanceState(Bundle savedInstanceState) {
		super.onRestoreInstanceState(savedInstanceState);
		getSherlock().dispatchRestoreInstanceState(savedInstanceState);
	}

	// /////////////////////////////////////////////////////////////////////////
	// Native menu handling
	// /////////////////////////////////////////////////////////////////////////

	public MenuInflater getSupportMenuInflater() {
		if (ActionBarSherlock.DEBUG)
			Log.d(TAG, "[getSupportMenuInflater]");

		return getSherlock().getMenuInflater();
	}

	public void invalidateOptionsMenu() {
		if (ActionBarSherlock.DEBUG)
			Log.d(TAG, "[invalidateOptionsMenu]");

		getSherlock().dispatchInvalidateOptionsMenu();
	}

	public void supportInvalidateOptionsMenu() {
		if (ActionBarSherlock.DEBUG)
			Log.d(TAG, "[supportInvalidateOptionsMenu]");

		invalidateOptionsMenu();
	}

	@Override
	public final boolean onCreatePanelMenu(int featureId, android.view.Menu menu) {
		if (ActionBarSherlock.DEBUG)
			Log.d(TAG, "[onCreatePanelMenu] featureId: " + featureId
					+ ", menu: " + menu);

		if (featureId == Window.FEATURE_OPTIONS_PANEL && !mIgnoreNativeCreate) {
			mIgnoreNativeCreate = true;
			boolean result = getSherlock().dispatchCreateOptionsMenu(menu);
			mIgnoreNativeCreate = false;

			if (ActionBarSherlock.DEBUG)
				Log.d(TAG, "[onCreatePanelMenu] returning " + result);
			return result;
		}
		return super.onCreatePanelMenu(featureId, menu);
	}

	@Override
	public final boolean onCreateOptionsMenu(android.view.Menu menu) {
		return true;
	}

	@Override
	public final boolean onPreparePanel(int featureId, View view,
			android.view.Menu menu) {
		if (ActionBarSherlock.DEBUG)
			Log.d(TAG, "[onPreparePanel] featureId: " + featureId + ", view: "
					+ view + ", menu: " + menu);

		if (featureId == Window.FEATURE_OPTIONS_PANEL && !mIgnoreNativePrepare) {
			mIgnoreNativePrepare = true;
			boolean result = getSherlock().dispatchPrepareOptionsMenu(menu);
			mIgnoreNativePrepare = false;

			if (ActionBarSherlock.DEBUG)
				Log.d(TAG, "[onPreparePanel] returning " + result);
			return result;
		}
		return super.onPreparePanel(featureId, view, menu);
	}

	@Override
	public final boolean onPrepareOptionsMenu(android.view.Menu menu) {
		return true;
	}

	@Override
	public final boolean onMenuItemSelected(int featureId,
			android.view.MenuItem item) {
		if (ActionBarSherlock.DEBUG)
			Log.d(TAG, "[onMenuItemSelected] featureId: " + featureId
					+ ", item: " + item.getTitle());

		if (featureId == Window.FEATURE_OPTIONS_PANEL && !mIgnoreNativeSelected) {
			mIgnoreNativeSelected = true;
			boolean result = getSherlock().dispatchOptionsItemSelected(item);
			mIgnoreNativeSelected = false;

			if (ActionBarSherlock.DEBUG)
				Log.d(TAG, "[onMenuItemSelected] returning " + result);
			return result;
		}
		return super.onMenuItemSelected(featureId, item);
	}

	@Override
	public final boolean onOptionsItemSelected(android.view.MenuItem item) {
		return false;
	}

	@Override
	public void openOptionsMenu() {
		if (!getSherlock().dispatchOpenOptionsMenu()) {
			super.openOptionsMenu();
		}
	}

	@Override
	public void closeOptionsMenu() {
		if (!getSherlock().dispatchCloseOptionsMenu()) {
			super.closeOptionsMenu();
		}
	}

	// /////////////////////////////////////////////////////////////////////////
	// Sherlock menu handling
	// /////////////////////////////////////////////////////////////////////////

	public boolean onCreateOptionsMenu(Menu menu) {
		return true;
	}

	public boolean onPrepareOptionsMenu(Menu menu) {
		return true;
	}

	public boolean onOptionsItemSelected(MenuItem item) {
		return false;
	}

	// /////////////////////////////////////////////////////////////////////////
	// Content
	// /////////////////////////////////////////////////////////////////////////

	@Override
	public void addContentView(View view, LayoutParams params) {
		getSherlock().addContentView(view, params);
	}

	@Override
	public void setContentView(int layoutResId) {
		getSherlock().setContentView(layoutResId);
	}

	@Override
	public void setContentView(View view, LayoutParams params) {
		getSherlock().setContentView(view, params);
	}

	@Override
	public void setContentView(View view) {
		getSherlock().setContentView(view);
	}

	public void requestWindowFeature(long featureId) {
		getSherlock().requestFeature((int) featureId);
	}

	@Override
	public View findViewById(int id) {
		getSherlock().ensureActionBar();
		return super.findViewById(id);
	}

	// /////////////////////////////////////////////////////////////////////////
	// Progress Indication
	// /////////////////////////////////////////////////////////////////////////

	public void setSupportProgress(int progress) {
		getSherlock().setProgress(progress);
	}

	public void setSupportProgressBarIndeterminate(boolean indeterminate) {
		getSherlock().setProgressBarIndeterminate(indeterminate);
	}

	public void setSupportProgressBarIndeterminateVisibility(boolean visible) {
		getSherlock().setProgressBarIndeterminateVisibility(visible);
	}

	public void setSupportProgressBarVisibility(boolean visible) {
		getSherlock().setProgressBarVisibility(visible);
	}

	public void setSupportSecondaryProgress(int secondaryProgress) {
		getSherlock().setSecondaryProgress(secondaryProgress);
	}
}
